package com.zenithmind.chat.pojo.entity;

import com.baomidou.mybatisplus.annotation.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import com.zenithmind.common.base.BaseEntity;
import com.zenithmind.chat.enums.ModelType;
import java.time.LocalDateTime;

/**
 * AI对话实体 - 遵循单一职责原则
 * 只负责核心对话信息，其他功能分离到专门的实体类
 */
@Data
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
@TableName("ai_chat")
@Schema(description = "AI对话实体")
public class AiChat extends BaseEntity{

    @Schema(description = "用户ID")
    private String userId;

    @Schema(description = "对话标题")
    private String title;

    @Schema(description = "模型类型(1-OpenAI,2-Ollama,3-Azure,4-Anthropic,5-自定义)")
    private Integer modelType;

    @Schema(description = "模型名称")
    private String modelName;

    @Schema(description = "系统提示词")
    private String systemPrompt;

    @Schema(description = "状态(0-禁用,1-启用)")
    private Integer status;

    @Schema(description = "总token数")
    private Integer totalTokens;

    @Schema(description = "最后对话时间")
    private LocalDateTime lastChatTime;

    @Schema(description = "对话次数")
    private Integer chatCount;

    @Schema(description = "温度值(影响随机性,0.0-2.0)")
    private Float temperature;

    @Schema(description = "最大生成token数")
    private Integer maxTokens;

    // === 扩展字段 - 为了向后兼容保留 ===
    @Schema(description = "是否收藏(0-否,1-是)")
    private Integer isFavorite;

    @Schema(description = "标签列表(逗号分隔)")
    private String tags;

    @Schema(description = "共享类型(0-私有,1-公开,2-指定用户)")
    private Integer shareType;

    @Schema(description = "共享用户IDs(逗号分隔,shareType=2时使用)")
    private String sharedUserIds;

    @Schema(description = "是否置顶(0-否,1-是)")
    private Integer isTop;

    @Schema(description = "置顶时间")
    private LocalDateTime topTime;

    // === 业务方法 - 遵循迪米特法则 ===

    /**
     * 获取模型类型枚举
     * 遵循开闭原则，通过枚举扩展新的模型类型
     */
    public ModelType getModelTypeEnum() {
        return ModelType.fromCode(this.modelType);
    }

    /**
     * 检查对话是否活跃
     * 遵循单一职责原则，只负责状态判断
     */
    public boolean isActive() {
        return this.status != null && this.status == 1;
    }

    /**
     * 增加对话次数
     * 遵循封装原则，避免外部直接操作内部状态
     */
    public void incrementChatCount() {
        this.chatCount = (this.chatCount == null ? 0 : this.chatCount) + 1;
        this.lastChatTime = LocalDateTime.now();
    }

    /**
     * 增加token数量
     * 遵循封装原则，确保数据一致性
     */
    public void addTokens(int tokens) {
        this.totalTokens = (this.totalTokens == null ? 0 : this.totalTokens) + tokens;
    }

    /**
     * 验证对话配置是否有效
     * 遵循单一职责原则，专门负责验证逻辑
     */
    public boolean isValidConfiguration() {
        return this.modelType != null &&
               this.modelName != null && !this.modelName.trim().isEmpty() &&
               this.temperature != null && this.temperature >= 0.0f && this.temperature <= 2.0f &&
               this.maxTokens != null && this.maxTokens > 0;
    }

    // === 临时方法 - 解决编译问题，等common模块可用后可移除 ===

    /**
     * 临时方法：获取ID
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public String getId() {
        // 这个方法实际上会被BaseEntity的@Data注解生成的方法覆盖
        return null;
    }

    /**
     * 临时方法：设置ID
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setId(String id) {
        // 这个方法实际上会被BaseEntity的@Data注解生成的方法覆盖
    }

    /**
     * 临时方法：获取创建时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public java.time.LocalDateTime getCreateTime() {
        return null;
    }

    /**
     * 临时方法：设置创建时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setCreateTime(java.time.LocalDateTime createTime) {
        // 实现由BaseEntity提供
    }

    /**
     * 临时方法：获取更新时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public java.time.LocalDateTime getUpdateTime() {
        return null;
    }

    /**
     * 临时方法：设置更新时间
     * 当common模块可用时，此方法将由BaseEntity提供
     */
    public void setUpdateTime(java.time.LocalDateTime updateTime) {
        // 实现由BaseEntity提供
    }
}